package cn.iocoder.yudao.module.api.trade.order;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.business.order.pojo.vo.OrderSubmitVO;
import cn.iocoder.yudao.module.api.product.evaluation.dto.ProductEvaluationCreateReqDTO;
import cn.iocoder.yudao.module.api.trade.order.dto.GiftTradeOrderSaveDTO;
import cn.iocoder.yudao.module.api.trade.order.dto.TradeOrderItemRespDTO;
import cn.iocoder.yudao.module.api.trade.order.dto.TradeOrderRespDTO;
import cn.iocoder.yudao.module.api.trade.order.vo.TradeOrderSummaryVO;
import jakarta.annotation.Nonnull;

import java.util.Collection;
import java.util.List;

/**
 * 订单 API 接口
 *
 * @author HUIHUI
 */
public interface TradeOrderApi {

    /**
     * 创建赠品订单
     */
    OrderSubmitVO createGiftTradeOrder(Long userId, GiftTradeOrderSaveDTO saveDTO);

    /**
     * 获得订单列表
     *
     * @param ids 订单编号数组
     * @return 订单列表
     */
    List<TradeOrderRespDTO> getOrderList(Collection<Long> ids);

    /**
     * 获得订单
     *
     * @param id 订单编号
     * @return 订单
     */
    TradeOrderRespDTO getOrder(Long id);

    /**
     * 获得订单
     *
     * @param no 交易单号
     * @return 订单
     */
    TradeOrderRespDTO getByTradeNo(String no);

    /**
     * 取消支付订单
     *
     * @param userId 用户编号
     * @param orderId 订单编号
     * @param cancelType 取消类型
     */
    void cancelPaidOrder(Long userId, Long orderId, Integer cancelType);

    /**
     * 获得订单项
     *
     * @param id 订单项编号
     * @return 订单项
     */
    TradeOrderItemRespDTO getOrderItem(Long id);

    /**
     * 获得订单项
     *
     * @param orderId 订单编号
     * @return 订单项
     */
    List<TradeOrderItemRespDTO> getOrderItemsByOrderId(Long orderId);

    /**
     * 获得订单下的产品名称集合
     *
     * @param orderId 订单编号
     * @return 产品名称集合
     */
    @Nonnull
    default List<String> getSpuNamesByOrderId(Long orderId) {
        List<TradeOrderItemRespDTO> items = getOrderItemsByOrderId(orderId);
        if (CollUtil.isEmpty(items)) {
            return List.of();
        }
        return items.stream().map(TradeOrderItemRespDTO::getSpuName).toList();
    }

    /**
     * 创建订单的评论
     *
     * @param userId      用户编号
     * @param dto 创建请求
     * @return 得到评价 id
     */
    Long createOrderCommentByMember(Long userId, ProductEvaluationCreateReqDTO dto);

    /**
     * 【商家】获取订单汇总
     *
     * @param shopId 店铺编号
     * @return 订单汇总
     */
    TradeOrderSummaryVO getOrderSummaryByShopId(Long shopId);

    /**
     * 创建虚拟的订单评论
     *
     * @param userId 用户编号
     * @param skuId 商品 SKU 编号
     * @return 订单项
     */
    TradeOrderItemRespDTO createVirtualOrderComment(Long userId, Long skuId);

    /**
     * 判断是否为店铺新客
     *
     * @param shopId 店铺编号
     * @param userId 用户编号
     */
    boolean isNewShopCustomer(Long shopId, Long userId);

}
